package com.liaozhai.community.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Component
public class MailClient {

    private static final Logger logger = LoggerFactory.getLogger(MailClient.class);

    @Autowired
    private JavaMailSender mailSender;

    @Value("${spring.mail.username}")
    private String from;

    /*1.引入线程池：通过创建ExecutorService线程池，可以在需要发送邮件时将任务提交到线程池中，由线程池管理线程的执行。
    这样做的好处是，可以避免每次发送邮件都创建新的线程，而是重复利用线程池中的线程，减少了线程创建和销毁的开销。*/

    /*2.异步发送邮件：在sendMail方法中，不再直接发送邮件，而是将邮件发送任务提交给线程池处理。
    这样做可以使发送邮件的操作变成异步的，即发送邮件的任务交给其他线程处理，而主线程不需要等待邮件发送完成就可以继续执行后续操作。
    这样可以提高页面响应速度，因为发送邮件不再阻塞主线程。*/

    private ExecutorService executorService = Executors.newCachedThreadPool();

    public void sendMail(String to, String subject, String content) {
        executorService.submit(() -> {
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message);
            try {
                helper.setFrom(from);
                helper.setTo(to);
                helper.setSubject(subject);
                helper.setText(content, true);
                mailSender.send(message);
            } catch (MessagingException e) {
                logger.error("发送邮件失败:" + e.getMessage());
            }
        });
    }

}
